#ifndef MOTORJUEGO_H
#define	MOTORJUEGO_H

#include <vector>
#include <string>
#include "Motor.h"
#include "Partida.h"
#include "Mutex.h"

using namespace std;
using namespace TP::Juego;
using namespace TP::Juego::Motorizacion::Sincronizacion;
using namespace TP::Threading;

namespace TP { namespace Juego { namespace Motorizacion { 

class MotorJuego : public Motor {
    
    friend class MotorJuegoFactory;

public:
    
    MotorJuego();
    
    virtual ~MotorJuego();
    
    virtual Ticks notificacionAvanceTiempo (Ticks pTiempo);
    
    virtual Partida* correrPartida (Partida* pPartida);
    
    Partida* getPartidaPorNombre (const string& pNombrePartida);
    
    virtual Partida* getPartidaPorJugador (Jugador* pJugador);

    string getPartidaPorJugadorAString (Jugador* pJugador);
    
    vector<string> listarPartidas();
    
    void removerJugadorDePartida(Partida* pPartida, Jugador* pJugador);
    
    void finalizarPartida (Partida* pPartida);
    
    void atacar (Jugador* pJugador, const string& pNombrePartida,
        Posicion* pPosicion) throw (Excepcion);
    
    vector<Partida*>& getPartidas();
    
    bool cerditoAvatarDisponibles (const string& pNombrePartida);
    
    void asignarJugadorACerditoAvatar (const string& pNombrePartida,
        Jugador* pJugador);
    
private:   
    vector<Partida*> _partidas;
    Mutex _mutex;
    Motor* _motorDesplazamiento;
    Motor* _motorAtaque;
    Motor* _MotorColisiones;
    Motor* _MotorLanzadorPajaritos;
};
}}}

#endif	/* MOTORJUEGO_H */